use std::fs;
use std::io;
use std::path::{Path, PathBuf};
use std::io::Write;

pub fn execute(args: &[String]) {
    if args.len() < 2 {
        eprintln!("用法: mv [-i] [-f] <源文件或目录>... <目标>");
        return;
    }

    let mut interactive = false; // 是否启用交互模式
    let mut force = false; // 是否启用强制模式
    let mut sources = vec![]; // 源文件或目录列表
    let target; // 目标路径

    // 解析命令行参数
    for arg in &args[..args.len() - 1] {
        match arg.as_str() {
            "-i" => interactive = true, // 交互模式
            "-f" => force = true, // 强制模式
            "-h" | "--help" => {
                println!("用法: mv [-i] [-f] <源文件或目录>... <目标>");
                return;
            },
            _ => sources.push(arg.clone()), // 视为源路径
        }
    }
    target = args[args.len() - 1].clone(); // 最后一个参数视为目标路径

    // 如果只有一个源，则进行移动或重命名
    if sources.len() == 1 {
        let source = Path::new(&sources[0]);
        let destination = Path::new(&target);
        move_single(source, destination, interactive, force);
    } else {
        // 多个源的情况，目标必须是目录
        let destination = Path::new(&target);
        if !destination.is_dir() {
            eprintln!("错误: 多个源文件时，目标必须是一个目录");
            return;
        }

        for source in &sources {
            let source_path = Path::new(source);
            let mut dest_path = PathBuf::from(destination);
            if let Some(file_name) = source_path.file_name() {
                dest_path.push(file_name);
            }

            move_single(source_path, &dest_path, interactive, force);
        }
    }
}

// 移动或重命名单个文件或目录
fn move_single(source: &Path, destination: &Path, interactive: bool, force: bool) {
    if !source.exists() {
        eprintln!("错误: 源文件或目录 '{}' 不存在", source.display());
        return;
    }

    // 如果目标文件已存在，处理覆盖逻辑
    if destination.exists() {
        if interactive && !confirm_overwrite(destination) {
            println!("跳过: {}", destination.display());
            return;
        }
        if !force && !interactive {
            eprintln!("错误: 目标 '{}' 已存在，使用 -f 强制覆盖或 -i 交互确认", destination.display());
            return;
        }
    }

    // 执行移动操作
    match fs::rename(source, destination) {
        Ok(_) => println!("移动 '{}' 到 '{}'", source.display(), destination.display()),
        Err(e) => eprintln!("无法移动 '{}' 到 '{}': {}", source.display(), destination.display(), e),
    }
}

// 确认是否覆盖目标文件
fn confirm_overwrite(destination: &Path) -> bool {
    print!("目标 '{}' 已存在，是否覆盖? (y/n): ", destination.display());
    io::stdout().flush().unwrap();

    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
    matches!(input.trim(), "y" | "Y")
}
